package com.leo.producer;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

/**
 * 同步发送
 */
public class MyProducer {
    public static void main(String[] args) throws Exception {

        // 该producer是线程安全的，可以多线程使用。
        // 建议使用多个Producer实例发送
        // 实例化生产者实例，同时设置生产组名称
        DefaultMQProducer producer = new DefaultMQProducer("myproducer_grp_01");

        // 设置实例名称。一个JVM中如果有多个生产者，可以通过实例名称区分
        // 默认DEFAULT
        producer.setInstanceName("producer_grp_01");

        // 设置同步发送重试的次数
        producer.setRetryTimesWhenSendFailed(2);

        // 设置异步发送的重试次数
        producer.setRetryTimesWhenSendAsyncFailed(2);

        // 指定NameServer的地址
        producer.setNamesrvAddr("localhost:9876");

        // 对生产者进行初始化，然后就可以使用了
        producer.start();


        // 同步发送消息，如果消息发送失败，则按照setRetryTimesWhenSendFailed设置的次数进行重试
        // broker中可能会有重复的消息，由应用的开发者进行处理
        // 创建消息，第一个参数是主题名称，第二个参数是消息内容
        Message message = new Message(
                "tp_demo_01",
                "hello world 01".getBytes(RemotingHelper.DEFAULT_CHARSET)
        );
        // 发送消息
        final SendResult result = producer.send(message);
        /**
         *  SEND_OK,
            FLUSH_DISK_TIMEOUT,  表示没有在规定时间内完成刷盘 (需要Broker的刷盘策略被设置成 `SYNC_FLUSH`才会报这个错误)。
            FLUSH_SLAVE_TIMEOUT, 表示在Master-Slave方式下，并且Broker被设置成`SYNC_MASTER`方式，没有在设定时间内完成主从同步。
            SLAVE_NOT_AVAILABLE, 这个状态产生的场景和FLUSH_SLAVE_TIMEOUT类似，表示在Master-Slave方式下，并且Broker被设置成`SYNC_MASTER`，但是没有找到被配置成Slave的Broker。
         */
        SendStatus sendStatus = result.getSendStatus();


        System.out.println(result);
        // 关闭生产者
        producer.shutdown();
    }
}
